{
  stdenvNoCC,
  fetchzip,
  lib,
  writeScript,
  autoPatchelfHook,
  testGaugePlugins,
}:

{
  pname,
  data,
  repo,
  releasePrefix,
  isCrossArch ? false,
  meta,
  ...
}@args:
let
  otherArgs = lib.attrsets.removeAttrs args [
    "pname"
    "data"
    "repo"
    "releasePrefix"
    "isMultiArch"
  ];
  inherit (stdenvNoCC.hostPlatform) system;
  inherit
    (
      if isCrossArch then
        data
      else
        data.${system} or (throw "gaugePlugins.${pname}: No source for system: ${system}")
    )
    url
    hash
    ;
  # Upstream uses a different naming scheme for platforms
  systemMap = {
    "x86_64-darwin" = "darwin.x86_64";
    "aarch64-darwin" = "darwin.arm64";
    "aarch64-linux" = "linux.arm64";
    "x86_64-linux" = "linux.x86_64";
  };
in
stdenvNoCC.mkDerivation (
  finalAttrs:
  (lib.recursiveUpdate {
    pname = "gauge-plugin-${pname}";
    inherit (data) version;

    src = fetchzip {
      inherit url hash;
      stripRoot = false;
    };

    nativeBuildInputs = lib.optional stdenvNoCC.hostPlatform.isLinux autoPatchelfHook;

    installPhase = ''
      mkdir -p "$out/share/gauge-plugins/${pname}/${finalAttrs.version}"
      cp -r . "$out/share/gauge-plugins/${pname}/${finalAttrs.version}"
    '';

    passthru = {
      tests.loadPlugin = testGaugePlugins { plugins = [ finalAttrs.finalPackage ]; };
      updateScript = writeScript "update-${finalAttrs.pname}" ''
        #!/usr/bin/env nix-shell
        #!nix-shell -i bash -p curl nix-prefetch yq-go

        set -e

        dirname="pkgs/development/tools/gauge/plugins/${pname}"

        currentVersion=$(nix eval --raw -f default.nix gaugePlugins.${pname}.version)

        latestTag=$(curl -s ''${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} https://api.github.com/repos/${repo}/releases/latest | yq ".tag_name")
        latestVersion="$(expr $latestTag : 'v\(.*\)')"

        tempfile=$(mktemp)

        if [[ "$FORCE_UPDATE" != "true" && "$currentVersion" == "$latestVersion" ]]; then
            echo "gauge-${pname} is up-to-date: ''${currentVersion}"
            exit 0
        fi

        yq -iPoj "{ \"version\": \"$latestVersion\" }" "$tempfile"

        updateSystem() {
            system=$1
            url=$2

            echo "Fetching hash for $system"
            hash=$(nix-prefetch-url --type sha256 $url --unpack)
            sriHash="$(nix --extra-experimental-features nix-command hash to-sri --type sha256 $hash)"

            yq -iPoj ". + { \"$system\": { \"url\": \"$url\", \"hash\": \"$sriHash\" } }" "$tempfile"
        }

        updateSingle() {
            url=$1

            echo "Fetching hash"
            hash=$(nix-prefetch-url --type sha256 $url --unpack)
            sriHash="$(nix --extra-experimental-features nix-command hash to-sri --type sha256 $hash)"

            yq -iPoj ". + { \"url\": \"$url\", \"hash\": \"$sriHash\" }" "$tempfile"
        }

        baseUrl="https://github.com/${repo}/releases/download/$latestTag/${releasePrefix}$latestVersion"

        ${
          if isCrossArch then
            "updateSingle \${baseUrl}.zip"
          else
            lib.concatStringsSep "\n" (
              map (
                platform: ''updateSystem "${platform}" "''${baseUrl}-${systemMap.${platform}}.zip"''
              ) meta.platforms
            )
        }

        mv "$tempfile" "$dirname/data.json"
      '';
    };
  } otherArgs)
)
